package Thread;
class SingletonLazy1{
    private static SingletonLazy1 instance = null;
//    private volatile static SingletonLazy1 instance = null;
    // 注意这个 volatile 关键字
    private static Object locker = new Object();
    public static SingletonLazy1 getInstance(){
//        Object locker = new Object();
//        synchronized (locker){
//            if(instance==null){
//                instance = new SingletonLazy1();
//            }
//            return instance;
//        } // 这样写, 会导致性能的下降, 如果此时 instance 不是null 还去加锁, 就会导致性能下降,
//        // 要在需要的时候, 加锁 在不需要的时候不加锁.

        // 如果instance 为空, 则说明 是首次调用 ,因此需要加上锁,
        // 如果不为空, 则不需要加锁, 从而可以提高性能
        if (instance==null){  // 这边判断 是因为 修改了instance 其他的线程中 instance 发生变化  从而不会进入下一层代码 从而避免锁阻塞
            synchronized (locker){
                if(instance==null){
                    instance = new SingletonLazy1();
                }
            }
        }
        return instance;
    }
}
public class ThreadDemo3 {
    public static void main(String[] args) {
        // 上面这个懒汉模式 其实是线程不安全的
    }
}
